#pragma once

#include "market_data.h"
#include "trade_data.h"
#include <string>
#include <memory>
#include <mutex>
#include <yaml-cpp/yaml.h>

namespace hft {

class Storage {
public:
    static Storage& getInstance() {
        static Storage instance;
        return instance;
    }

    // 初始化存储配�?
    bool init(const YAML::Node& config);

    // 存储市场数据
    bool storeMarketData(const MarketDataMessage& data);

    // 存储成交数据
    bool storeTrade(const Trade& trade);

    // 存储订单数据
    bool storeOrder(const Order& order);

    // 存储持仓数据
    bool storePosition(const Position& position);

    // 存储账户数据
    bool storeAccount(const Account& account);

private:
    Storage() = default;
    ~Storage() = default;

    // 禁止拷贝和移�?
    Storage(const Storage&) = delete;
    Storage& operator=(const Storage&) = delete;
    Storage(Storage&&) = delete;
    Storage& operator=(Storage&&) = delete;

    // 存储配置
    struct StorageConfig {
        std::string market_data_path;      // 市场数据存储路径
        std::string trade_data_path;       // 交易数据存储路径
        std::string format;                // 存储格式
        bool compression;                  // 是否压缩
    } config_;

    // 文件句柄
    struct FileHandles {
        std::unique_ptr<std::ofstream> market_data_file;
        std::unique_ptr<std::ofstream> trade_data_file;
        std::unique_ptr<std::ofstream> order_data_file;
        std::unique_ptr<std::ofstream> position_data_file;
        std::unique_ptr<std::ofstream> account_data_file;
    } files_;

    std::mutex mutex_;

    // 创建存储目录
    bool createDirectories();

    // 打开文件
    bool openFiles();

    // 关闭文件
    void closeFiles();

    // 写入CSV�?
    void writeCSVHeaders();

    // 获取当前日期字符�?
    std::string getCurrentDateString();
};

} // namespace hft 
